iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
Modern Web

寫給PHP開發者的30堂網路爬蟲開發系列 第 23

Day 23:案例研究 3-1 分析凱基證券網站與內容擷取方法

  • 分享至 

  • xImage
  •  

前言

在昨天課程中,講述為什麼要針對這個網頁進行擷取與實做爬蟲,在本日要做的事情是:

  • 對此網站做分析,找到可行的實做爬蟲方式
  • 針對此網站爬回來的內容,找到可行的方式來擷取出收盤價的檔案

網站爬蟲分析

首先,先進入這個網站

https://ithelp.ithome.com.tw/upload/images/20191008/20103975YAD3AaIImY.png

接著可以看到上面這個截圖,我們打開Chrome開發者控制台,並試著找到這個表格在哪,相關操作截圖如下:

https://ithelp.ithome.com.tw/upload/images/20191008/20103975Yz1m0nfGOV.png

這樣從上面截圖可以知道,這個收盤價的表格檔案下載表格HTML內容:

<table width="778" border="0" align="right" cellpadding="0" cellspacing="0">
      <tbody><tr>
        <td><table width="778" border="0" cellspacing="0" cellpadding="0">
          <tbody><tr>
            <td width="648" align="left" valign="middle" class="menu01">
              您現在位置:<a href="../index/index.aspx">首頁</a> > <a href="stock_home.aspx">台股</a> > <a href="stock_2_1.aspx?findex=1">大盤動態</a> > <span style="color:#ff9933">收盤價下載</span>            </td>
            <td width="130"> </td>
          </tr>
        </tbody></table></td>
      </tr>
      <tr>
        <td height="10"><img src="../images/1_space.gif" width="1" height="1"></td>
      </tr>
      <tr>
        <td height="35" valign="top"><img src="../images/title_buy04.gif" width="778" height="20"></td>
      </tr>
       <tr>
         <td valign="top"><table width="778" border="0" cellspacing="0" cellpadding="0">
           <tbody><tr>
             <td><img src="../images/download_head2.gif" width="778" height="29"></td>
           </tr>
           <tr>
             <td><table width="778" border="0" cellspacing="0" cellpadding="0">
               <tbody><tr>
                 <td width="250" height="25" align="center" valign="middle" class="menu01">
                     <span id="lblDate01">2019-10-08</span>                 </td>
                 <td width="528" align="center" valign="middle" class="menu02">
                     <img src="../images/xls.gif" width="16" height="16">
                     <a id="lbtnDown01" class="menu02" href="javascript:__doPostBack('lbtnDown01','')">下載</a>                 </td>
               </tr>
               <tr>
                 <td height="1" colspan="2" background="../images/dot_line.gif"><img src="../images/1_space.gif" width="1" height="1"></td>
                 </tr>
             </tbody></table></td>
           </tr>
           <tr>
             <td><table width="778" border="0" cellspacing="0" cellpadding="0">
               <tbody><tr>
                 <td width="250" height="25" align="center" valign="middle" class="menu01">
                     <span id="lblDate02">2019-10-07</span>                 </td>
                 <td width="528" align="center" valign="middle" class="menu02">
                     <img src="../images/xls.gif" width="16" height="16">
                     <a id="lbtnDown02" class="menu02" href="javascript:__doPostBack('lbtnDown02','')">下載</a>                 </td>
               </tr>
               <tr>
                 <td height="1" colspan="2" background="../images/dot_line.gif"><img src="../images/1_space.gif" width="1" height="1"></td>
                 </tr>
             </tbody></table></td>
           </tr>
           <tr>
             <td><table width="778" border="0" cellspacing="0" cellpadding="0">
               <tbody><tr>
                 <td width="250" height="25" align="center" valign="middle" class="menu01"><span id="lblDate03" class="menu01">2019-10-04</span>                 </td>
                 <td width="528" align="center" valign="middle" class="menu02"><img src="../images/xls.gif" width="16" height="16">
                   <a id="lbtnDown03" href="javascript:__doPostBack('lbtnDown03','')">下載</a>                 </td>
               </tr>
               <tr>
                 <td height="1" colspan="2" background="../images/dot_line.gif"><img src="../images/1_space.gif" width="1" height="1"></td>
                 </tr>
             </tbody></table></td>
           </tr>
           <tr>
             <td><table width="778" border="0" cellspacing="0" cellpadding="0">
               <tbody><tr>
                 <td width="250" height="25" align="center" valign="middle" class="menu01">
                     <span id="lblDate04">2019-10-03</span>                 </td>
                 <td width="528" align="center" valign="middle" class="menu02">
                     <img src="../images/xls.gif" width="16" height="16">
                     <a id="lbtnDown04" href="javascript:__doPostBack('lbtnDown04','')">下載</a>                 </td>
               </tr>
               <tr>
                 <td height="1" colspan="2" background="../images/dot_line.gif"><img src="../images/1_space.gif" width="1" height="1"></td>
                 </tr>
             </tbody></table></td>
           </tr>
           <tr>
             <td><table width="778" border="0" cellspacing="0" cellpadding="0">
               <tbody><tr>
                 <td width="250" height="25" align="center" valign="middle" class="menu01">
                     <span id="lblDate05">2019-10-02</span>                 </td>
                 <td width="528" align="center" valign="middle" class="menu02">
                     <img src="../images/xls.gif" width="16" height="16">
                     <a id="lbtnDown05" href="javascript:__doPostBack('lbtnDown05','')">下載</a>                 </td>
               </tr>
               <tr>
                 <td height="1" colspan="2" background="../images/dot_line.gif"><img src="../images/1_space.gif" width="1" height="1"></td>
                 </tr>
             </tbody></table></td>
           </tr>
         </tbody></table></td>
       </tr>
       <tr>
         <td> </td>
       </tr>
       <tr>
         <td>
			 註1:每日收盤價轉檔時間為PM4:30<br>
			 註2:成交量單位:上市櫃(張)、興櫃(股)<br>
			 註3:本文所載資料僅供參考,資料來源以<a href="https://www.twse.com.tw/" target="_blank">臺灣證券交易所</a>公告為準
		 </td>
       </tr>
       <tr>
         <td>
                     </td>
       </tr>
    </tbody></table>

接著看起來這個表格的元素:<table width="778" border="0" align="right" cellpadding="0" cellspacing="0">.....</table>是獨特的。

接著看其中一個檔案下載連結,可以發現裡面會觸發前端某一個JavaScript函數。相關連結中放的觸發JS如下:

javascript:__doPostBack('lbtnDown01','')

接著,找到了這段JS函數,相關的節錄如下:

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

稍微按下下載連結,監控一下HTTP是怎麼發送的。相關監控的HTTP發送截圖如下:

https://ithelp.ithome.com.tw/upload/images/20191008/20103975sZRU2DsO8I.png

看了表單參數,跟前一個案例研討一樣,有__EVENTVALIDATION等相關ASPX表單參數。

綜合上面的分析,可以得到爬蟲實做方法與擷取內容方法:

爬蟲實做方法

  • 使用HTTP GET方法請求這個收盤價檔案下載的網站
  • 透過回應回來的內容,擷取出每個收盤價檔案請求的方式

收盤價檔案擷取方法

  • 上面爬蟲實做完成之後,可以找到每個__EVENTTARGET__EVENTARGUMENT參數所對應的收盤價檔案。
  • 找到相對應的表單參數之後,利用HTTP POST方法分別去請求這些收盤價檔案回來。

結論

透過上面的分析,我們可以分別知道爬蟲該如何實做,以及回應回來的網站內容擷取方法,在明日案例研討中,將會實做爬蟲出來,並試著解析網站內容中對應的收盤價檔案連結請求方式。


上一篇
Day 22:案例研究 3-1 分析凱基證券網站之收盤價檔案下載
下一篇
Day 24:案例研究 3-1 凱基證券網站爬蟲實做
系列文
寫給PHP開發者的30堂網路爬蟲開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言